#!/bin/bash
# 脚本名称：check_temporary_user_expiry.sh
# 说明：
#   - 查找系统中即将过期的临时用户
#   - 提前通知管理员，方便续期或删除
#   - 适用于 Linux 服务器环境

set -euo pipefail

# 用户名前缀（默认使用 tempuser，需与 create_temporary_users.sh 保持一致）
USER_PREFIX="tempuser"
# 多少天内过期的用户需要提醒（默认 3 天）
WARNING_DAYS=3
# 发送通知的管理员邮箱（可修改）
ADMIN_EMAIL="admin@example.com"

# 获取即将过期的用户列表
echo "🔍 正在检查即将过期的临时用户（$WARNING_DAYS 天内）..."
echo ""

# 获取当前日期
CURRENT_DATE=$(date +%s)

# 查找符合条件的用户
EXPIRED_USERS=()
while IFS=: read -r username expire_date; do
    # 跳过没有设置过期时间的账户
    if [[ -z "$expire_date" || "$expire_date" == "0000-00-00" ]]; then
        continue
    fi

    # 计算剩余天数
    EXPIRE_TIMESTAMP=$(date -d "$expire_date" +%s)
    DAYS_LEFT=$(( (EXPIRE_TIMESTAMP - CURRENT_DATE) / 86400 ))

    # 如果在 WARNING_DAYS 内，则加入提醒列表
    if [[ "$DAYS_LEFT" -le "$WARNING_DAYS" && "$DAYS_LEFT" -ge 0 ]]; then
        EXPIRED_USERS+=("$username (过期时间: $expire_date, 剩余: $DAYS_LEFT 天)")
    fi
done < <(awk -F: -v prefix="$USER_PREFIX" '$1 ~ "^" prefix {print $1, $8}' /etc/shadow)

# 输出即将过期的用户列表
if [[ ${#EXPIRED_USERS[@]} -eq 0 ]]; then
    echo "✅ 没有用户即将在 $WARNING_DAYS 天内过期。"
else
    echo "⚠️ 以下临时用户即将在 $WARNING_DAYS 天内过期："
    for user in "${EXPIRED_USERS[@]}"; do
        echo "  - $user"
    done

    # 可选：发送邮件通知管理员
    if command -v mail &>/dev/null; then
        echo -e "主题: 临时用户即将过期提醒\n\n以下用户即将在 $WARNING_DAYS 天内过期：\n\n$(printf '%s\n' "${EXPIRED_USERS[@]}")" | mail -s "临时用户过期提醒" "$ADMIN_EMAIL"
        echo "📧 通知已发送至管理员：$ADMIN_EMAIL"
    else
        echo "⚠️ 'mail' 命令未安装，无法发送邮件通知。"
    fi
fi

exit 0

